/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import beans.Examen;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import static dao.DAOUtilitaire.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author florianpf
 */
public class ExamenDAOImpl implements ExamenDAO{

    private DAOFactory  daoFactory;
    
    private static final String SQL_SELECT = "SELECT * from examen where id_exam=?";
    private static final String SQL_INSERT = "INSERT INTO examen (libelle_examen, date_examen, matiere, professeur, promotion) VALUES (?, ?, ?, ?, ?)";
    private static final String SQL_SELECT_PAR_IDPROF = "SELECT id_exam, libelle_examen, date_examen, e.promotion, e.matiere, e.professeur FROM examen e, utilisateur u WHERE u.id_utilisateur = ?";
          
    ExamenDAOImpl(DAOFactory daoFactory) {
        this.daoFactory = daoFactory;
    }
    
    @Override
    public void creerExamen(Examen examen) {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true, examen.getLibelleExamen(), examen.getDateExam(), examen.getMatiere(), examen.getProfesseur(), examen.getPromotion());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'examen, aucune ligne ajoutée dans la table." );
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if ( valeursAutoGenerees.next() ) {
                /* Puis initialisation de la propriété id du bean Examen avec sa valeur */
                examen.setId_exam( valeursAutoGenerees.getInt( 1 ) );
            } else {
                throw new DAOException( "Échec de la création de l'examen en base, aucun ID auto-généré retourné." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
    }
    
    @Override
    public List<Examen> ExamensPrisEnCharge(Integer idProf) throws IllegalArgumentException, DAOException{
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Examen> examens = new ArrayList<Examen>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_IDPROF, true, idProf);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               examens.add(map(resultSet));
            }
            return examens;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
        
        private static Examen map( ResultSet resultSet ) throws SQLException {
        Examen examen = new Examen();
        examen.setId_exam(resultSet.getInt("id_exam"));
        examen.setLibelleExamen(resultSet.getString("libelle_examen"));
        examen.setDateExam(resultSet.getString("date_examen"));
        examen.setMatiere(resultSet.getInt("matiere"));
        examen.setProfesseur(resultSet.getInt("professeur"));
        examen.setPromotion(resultSet.getInt("promotion"));
        return examen;
    }

    @Override
    public Examen trouverExamen(Integer idExamen) throws IllegalArgumentException, DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Examen examen = new Examen();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT, true, idExamen);
            resultSet = preparedStatement.executeQuery();            

            while(resultSet.next()){
               examen=(map(resultSet));
            }
            return examen;    
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
    }
    
}
